//定制请求的实例
import { ElMessage } from 'element-plus'
//导入axios  npm install axios
import axios, { AxiosError, AxiosInstance } from 'axios';
import { type AxiosResponse } from 'axios'
import webConfig from '@/config/webConfig';
import { useUserStore } from '@/stores/userStore';

let hasShownError = false;
//定义一个变量,记录公共的前缀,  baseURL
const baseURL = '/api';
const request: AxiosInstance = axios.create({
  baseURL,
  timeout: 60 * 10000,
  responseType: "json",
  headers:
    { 'Content-Type': 'application/json;charset=UTF-8' },
})
//添加请求拦截器
request.interceptors.request.use(
  (config) => {
    // 白名单
    let whiteList = webConfig.whiteListApi as string[]
    let url = config.url as string
    // token配置
    const token = localStorage.getItem('token')
    if (
      whiteList.every((whiteUrl) => {
        const regex = new RegExp(`^${whiteUrl.replace(/\*/g, '.*')}$`);
        return !regex.test(url);
      }) &&
      token
    ) {
      config.headers.token = token
    }
    // 密钥,加密
    // webConfig.secretId + new Date().toString
    return config
  },
  (err) => {
    ElMessage.error(err)
    return Promise.reject(new Error(err))
  }
)

import router from '@/router'

//添加响应拦截器
request.interceptors.response.use(
  (response: AxiosResponse) => {
    const { code, msg } = response.data
    // 处理文件下载blob数据
    if (response.data instanceof Blob) return response.data
    // 处理成功的响应
    // 401
    if (code !== 1) {
      // 非成功响应码，显示错误消息
      ElMessage.error(msg);
      setTimeout(() => {
        router.back()
      }, 1000);
      return Promise.reject(new Error(msg))
    }
    // 成功响应，直接返回响应数据
    return response.data

  },
  (error: AxiosError) => {
    // 处理请求错误  
    if (!error.response) {
      // 网络错误，请求没有成功发送到服务器  
      ElMessage.error('网络异常');
      return Promise.reject(new Error('网络异常'));
    }

    const status = error.response.status;
    if (status === 401 && !hasShownError) {
      // 未授权，跳转到登录页面
      router.push('/login');
      const userStore = useUserStore()
      userStore.logout()
      hasShownError = true
      ElMessage.error('当前未登录，请先登录');
    } else if (status >= 400 && status < 500) {
      // 客户端错误（4xx 错误）
    } else if (status >= 500) {
      // 服务器错误（5xx 错误）
    } else {
      // 其他未知的 HTTP 状态码
    }
    return Promise.reject(new Error(`状态码：${status}`));
  }
)

export default request;